﻿using Microsoft.EntityFrameworkCore;
using machine_registration.ViewModels;
using System.ComponentModel;
using machine_registration.Models;
using Microsoft.Extensions.DependencyInjection;

namespace machine_registration.Helpers
{
    // 添加基类继承 
    public class AppDbContext : DbContext
    {
        public DbSet<BorrowRecord> BorrowRecords { get; set; }
        public DbSet<DeviceInventory> DeviceInventorys { get; set; }
        // 重写基类方法（注意必须添加 protected override）
        protected override void OnConfiguring(DbContextOptionsBuilder options)  => options.UseSqlite("Data Source=app.db");


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            #region DeviceInventory 配置
            modelBuilder.Entity<DeviceInventory>(entity =>
            {
                // 唯一索引（非主键）
                entity.HasIndex(e => e.MachineId)
                      .IsUnique();

                // ✅ 正确的一对多关系
                entity.HasMany(d => d.BorrowRecords)
                      .WithOne(b => b.DeviceInventory)
                      .HasForeignKey(b => b.DeviceInventoryId) // 外键字段名
                      .HasPrincipalKey(d => d.InventoryId)     // 主实体主键
                      .OnDelete(DeleteBehavior.Cascade);        // 级联删除
            });

            // 枚举值转换配置
            modelBuilder.Entity<DeviceInventory>()
                .Property(b => b.Status)
                .HasConversion(
                    v => v.GetDescription(),
                    v => v.ToBorrowStatus()
                )
                .HasMaxLength(20);
            #endregion
    //        #region DeviceInventory 配置
    //        modelBuilder.Entity<DeviceInventory>()
    //.HasIndex(e => e.MachineId)
    //.IsUnique(); // 强制SN号唯一 
        
    //        //在 DbContext 中配置一对多关系：
    //        modelBuilder.Entity<DeviceInventory>()
    //    .HasMany(d => d.BorrowRecords)
    //    .WithOne(b => b.DeviceInventory)
    //    .HasForeignKey(b => b.BorrowRecordsId);

    //        // 在 DbContext 配置级联删除
    //        modelBuilder.Entity<DeviceInventory>()
    //            .HasMany(d => d.BorrowRecords)
    //            .WithOne(b => b.DeviceInventory)
    //            .OnDelete(DeleteBehavior.Cascade);  // 删除设备时自动删除关联记录

    //        modelBuilder.Entity<DeviceInventory>()
    //         .Property(b => b.Status)
    //         .HasConversion(
    //             v => v.GetDescription(),       // 写入数据库时的转换  
    //             v => v.ToBorrowStatus()        // 从数据库读取时的转换  
    //         ).HasMaxLength(20);
    //        #endregion

            #region BorrowRecord 配置
            modelBuilder.Entity<BorrowRecord>()
             .Property(b => b.Uuid)
             .HasDefaultValueSql(
                 "lower(hex(randomblob(16)) || '-' || substr(hex(randomblob(2)),1,4))"
             )
             .HasMaxLength(36);
            // 设备状态转换配置  
            modelBuilder.Entity<BorrowRecord>()
                .Property(b => b.Status)
                .HasConversion(
                    v => v.GetDescription(),       // 写入数据库时的转换  
                    v => v.ToBorrowStatus()        // 从数据库读取时的转换  
                ) .HasMaxLength(20);

     
            #endregion


        }
       

       
    }
    // 扩展方法实现  
    public static class BorrowStatusExtensions
    {
        public static string GetDescription(this InventoryStatus status)
        {
            var field = status.GetType().GetField(status.ToString());
            return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                is DescriptionAttribute attr ? attr.Description : status.ToString();
        }

        public static InventoryStatus ToBorrowStatus(this string value)
        {
            foreach (var field in typeof(InventoryStatus).GetFields())
            {
                if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                    is DescriptionAttribute attr && attr.Description == value)
                {
                    return (InventoryStatus)field.GetValue(null);
                }
            }
            return InventoryStatus.InStock; // 默认值  
        }
    }
}